package core;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

/**
 * Questa classe rappresenta il cono, un cono rappresenta tutte le LogicGate da cui dipende una certa uscita.
 * @author Giovanni Richini
 * @author Michael Maghella
 * @version 1.0
 *
 */
public class Cono implements Cloneable {
	private Set<Node> cono;
	private Node root;
	private String marcatura;
	/**
	 * Costruttore della classe.
	 * @param _root
	 * @param _cono
	 */ 
	public Cono(Node _root){
		root=_root;
		cono = new HashSet<Node>();
	}
	
	/**
	 * Metodo per aggiungere una LogicGate al cono.
	 * @param lg
	 */
	public void aggiungiPorta(Node lg){
		cono.add(lg);
	}
	
	/**
	 * Metodo per stampare il contenuto di un cono.
	 * @return str
	 */
	public String toString(){
		String str="OUTPUT("+root+")=";
		ArrayList<Node> conoList = new ArrayList<Node>(cono);
		str+=marcatura+","+"{"+conoList.get(0);		
		for(int i=1; i<conoList.size(); i++){
			str=str+","+conoList.get(i).toString();
		}
		str+="}";
		return str;
	}

	/**
	 * Metodo per estrarre la root del cono ovvero l'uscita.
	 * @return root
	 */
	public Node getRoot() {
		return root;
	}

	/**
	 * Metodo per settare la root del cono.
	 * @param output
	 */
	public void setRoot(Node output) {
		this.root = output;
	}
	
	/**
	 * Metodo per ritornare il cono.
	 * @return cono
	 */
	public Set<Node> getCono() {
		return cono;
	}
	
	public void addNodeToCono(Node n){
		this.cono.add(n);
	}

	public String getMarcatura() {
		return marcatura;
	}

	public void setMarcatura(String value) {
		this.marcatura = value;
	}
	
	public void setCono(Set<Node> c) {
		this.cono=c;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	//getter e setter

	public void removeNode(Node node) {
		for(Node n : this.cono)
		    if(n.getId().endsWith(node.getId())){
		    	this.cono.remove(n);
		    }
	}



}
